Validando dados de empenho do Portal da Transparência

(2019-2022)

Código
library(tidyverse)
library(here)
library(lubridate)
library(colorspace)
library(glue)
source(here("src/00-plot-aesthetics.R"), encoding = "utf-8")

Coletamos os dados de empenhos do Portal da Transparência e comparamos a agregação dos valores empenhados por ano com os mesmos dados consultados na plataforma SIGA. Temos dúvidas se a plataforma SIGA considera anulações de empenhos na demonstração de valores agregados a partir de 2021, pois o campo especie_empenho está marcado como "Não aplicável".

O campo especie_empenho é definido no dicionário de dados do Portal da Transparência como:

Campo existente até 2020 indicando se o Empenho era de Reforço, Cancelamento, Estorno, Anulação ou Original. A partir de 2021, as alterações no Empenho são registradas em histórico do próprio Empenho original (planilha AAAAMMDD_Despesas_ItemEmpenhoHistorico.csv).

Dados

Empenhos - SIGA/Senado

Consultando no SIGA, podemos ver os valores empenhados para para unidade gestora: 257052 - DISTRITO SANIT.ESP.INDIGENA - YANOMAMI

Código
siga_senado <- tibble(
  ano_emissao_empenho = 2019:2023,
  base = "SIGA SENADO",
  valor_do_empenho_convertido_pra_r = c(
    43039167,
    42643267,
    65805003,
    60882543,
    29754205
  ))

siga_senado %>%
  ggplot(aes(
    x = ano_emissao_empenho,
    y = valor_do_empenho_convertido_pra_r,
    fill = base,
    color = after_scale(darken(fill, .4))
  )) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = reais(valor_do_empenho_convertido_pra_r)), nudge_y = 2e6) +
  scale_y_continuous(labels = reais, expand = c(0, 0), limits = c(0, 7e7)) +
  scale_fill_manual(values = c("SIGA SENADO" = cores_aep[["laranja"]])) +
  labs(
    title = "Empenhos divulgados no Portal SIGA-SENADO",
    y = "Valores empenhados", x = "Ano (SIAFI)"
  )

Empenhos - Portal da Transparência

Foram baixados os empenhos das planilhas diárias do portal da transparência e aplicado um filtro para unidade gestora: 257052 - DISTRITO SANIT.ESP.INDIGENA - YANOMAMI

Código
empenhos <- readRDS(here("data/empenhos.rds"))

Os valores empenhados não vão bater com o valor do portal SIGA, pois os empenhos são classificados de acordo com o campo especie_empenho, abaixo nós podemos observar a somatória de cada espécie de empenho, note que não há descontos para empenhos de anulação, cancelamento, estorno, etc. (esses valores deveriam ser negativos). Outro ponto importante é que a partir de 2021 a marcação do campo especie_empenho é descontinuada.

Código
empenhos %>%
  count(
    ano_emissao_empenho = year(data_emissao),
    especie_empenho, sort = TRUE
  ) %>%
  complete(ano_emissao_empenho, especie_empenho, fill = list(n = 0)) %>%
  mutate(especie_empenho = ordered(especie_empenho, levels = names(cores_especie_empenhos_raw))) %>%
  ggplot(aes(
    x = especie_empenho,
    y = n,
    fill = especie_empenho,
    color = after_scale(darken(fill, .4))
  )) +
  geom_col(position = "dodge", show.legend = FALSE) +
  geom_text(aes(label = n), vjust = -1) +
  facet_wrap(~ ano_emissao_empenho, nrow = 1) +
  scale_fill_manual(values = cores_especie_empenhos_raw) +
  scale_y_continuous(expand = c(0.01, 0), limits = c(0, 400)) +
  labs(
    title = "Quantidade de empenhos por \"espécie\"",
    subtitle = "A partir de 2021 o campo `especie_empenho` passa a não ter mais validade na classificação de empenhos",
    y = "Quantidade de empenhos",
    x = NULL
  ) +
  theme(
    axis.text.x = element_text(hjust = 1, angle = 45)
  )

Código
empenhos %>%
  count(
    ano_emissao_empenho = year(data_emissao),
    especie_empenho,
    wt = valor_do_empenho_convertido_pra_r,
    sort = TRUE
  ) %>%
  complete(ano_emissao_empenho, especie_empenho, fill = list(n = 0)) %>%
  mutate(especie_empenho = ordered(especie_empenho, levels = names(cores_especie_empenhos_raw))) %>%
  ggplot(aes(
    x = especie_empenho,
    y = n,
    fill = especie_empenho,
    color = after_scale(darken(fill, .4))
  )) +
  geom_col(position = "dodge", show.legend = FALSE) +
  geom_text(
    data = . %>% filter(n > 0),
    nudge_y = 2e6, hjust = 0, angle = 90,
    aes(label = reais_milhoes(n))
  ) +
  facet_wrap(~ ano_emissao_empenho, nrow = 1) +
  scale_fill_manual(values = cores_especie_empenhos_raw) +
  scale_y_continuous(expand = c(0.01, 0), limits = c(0, 9e7), labels = reais) +
  labs(
    title = "Valores empenhados por \"espécie\"",
    subtitle = "Empenhos de anulação sempre possuem valor positivo",
    y = "Valor empenhado",
    x = NULL
  ) +
  theme(
    axis.text.x = element_text(hjust = 1, angle = 45)
  )

Portanto, para obtermos os valores mais próximos daqueles do portal SIGA, devemos tratar os dados tornando negativos os valores de anulações, cancelamentos, estornos e inválidos.

Código
corrige_valores <- function(esp, vlr) {
  descontos <- c("ANULAÇÃO", "CANCELAMENTO", "ESTORNO", "Inválido")
  if_else(esp %in% descontos, vlr * -1, vlr)
}
Existem anulações de empenho a partir de 2021?

Aplicando a correção acima só conseguimos tratar dos empenhos nos anos de 2019 e 2020. Não sabemos, a priori, quais empenhos foram anulados a partir de 2021.

Código
empenhos %>%
  mutate(
    valor_do_empenho_convertido_pra_r = corrige_valores(
      esp = especie_empenho,
      vlr = valor_do_empenho_convertido_pra_r
  )) %>%
  count(
    ano_emissao_empenho = year(data_emissao),
    base = "Portal da transparência\n(corrigido)",
    wt = valor_do_empenho_convertido_pra_r,
    name = "valor_do_empenho_convertido_pra_r"
  ) %>%
  bind_rows(siga_senado) %>%
  ggplot(aes(
    x = "",
    y = valor_do_empenho_convertido_pra_r,
    fill = base,
    color = after_scale(darken(fill, .4))
  )) +
  geom_col(position = "dodge", alpha = .8) +
  geom_text(
    position = position_dodge(width = .9),
    vjust = -1,
    hjust = 0,
    size = 4,
    fontface = "bold",
    angle = 45,
    aes(label = if_else(
      valor_do_empenho_convertido_pra_r > 0,
      scales::number(valor_do_empenho_convertido_pra_r, big.mark = ".", decimal.mark = ","),
      "Sem dados"
  ))) +
  scale_y_continuous(
    labels = ~ scales::number(., big.mark = ".", decimal.mark = ","),
    limits = c(0, 9e7),
    expand = c(0, 0),
    breaks = seq(0, 6e7, 2e7)
  ) +
  scale_fill_manual(values = c(
    "Portal da transparência\n(corrigido)" = cores_aep[["rosa"]],
    "SIGA SENADO" = cores_aep[["laranja"]]
  )) +
  labs(
    title = "Soma de `valor_do_empenho_convertido_para_r` (em R$ - 2019-2023)",
    subtitle = glue(
      "\n- A somatória realizada nos valores de empenho no SIGA/Senado ",
      "não leva em consideração os empenhos de anulação e ",
      "\ndos anos de 2021 e 2022. ",
      "Para os anos de 2019 e 2020 os empenhos de anulação estão ",
      "descontados da somatória.\n\n"
    ),
    x = "Ano",
    fill = "Base consultada"
  ) +
  theme(
    legend.position = "top",
    legend.title.align = .5,
    strip.placement = "outside",
    strip.text = element_text(face = "bold"),
    panel.spacing = unit(.5, "lines")
  ) + #c(.92, .8)) +
  facet_wrap(~ano_emissao_empenho, nrow = 1, scales = "free_x", strip.position = "bottom")

Possível solução

A API do Portal da Transparência possui um endpoint para consulta de histórico dos itens empenhados. Esse histórico só pode ser consultado para empenhos a partir de 2021 e um dos campos é fase_operacao, onde podemos saber se o item empenhado diz respeito à inclusão, reforço ou anulação do item.

Código
library(DT)
readRDS(here("data/empenhos-item-historico.rds")) %>%
  select(-aaaammdd, -error, -id_empenho) %>%
  mutate(
    tipo_operacao = as.factor(tipo_operacao),
    codigo_empenho = glue('<a href = "https://portaldatransparencia.gov.br/despesas/empenho/{codigo_empenho}">{codigo_empenho}</a>')
  ) %>%
  datatable(rownames = FALSE,
            filter = "top",
            escape = FALSE,
            options = list(pageLength = 10, searchHighlight = TRUE)) %>%
  formatCurrency(c("valor_total_item", "valor_unitario_item"), currency = "R$ ", mark = ".", dec.mark = ",") %>%
  formatStyle(columns = 1:7, fontSize = "70%")
Nota

O esquema de dados abaixo apresenta os cruzamentos de tabelas necessários para se obter valores empenhados considerando os empenhos anulados.

Esquema de dados

classDiagram
  direction UD
  class empenhos_por_fase_operacao {
    descrição: "dataset de empenhos na DSEI-Y em formato long | 2021 - 2022"
    data_operacao
    codigo_empenho
    fase_operacao : (empenho original/reforço/anulação)
    valor_operacao
    tipo_operacao : (empenho)
  }
  class empenhos_item_historico {
    descrição : "dataset com histórico de itens empenhados na DSEI-Y | 2021-2022"
    dataset: data/empenhos-item-historico.rds
    cod_fonte: src/17-funcao-get-item-historico.R
    tipo_operacao : (Inclusão, Reforço, Anulação)
    origem: API (portal da transparência)
  }
  class empenhos {
    descrição : "dataset de empenhos da DSEI-Y"
    dataset: data/empenhos.rds
    cod_fonte: src/10-extrai-e-abre-csvs-de-empenho.R
    origem: site - csvs diários (portal da transparência)
    especie : (Não se aplica)
  }

  empenhos_item_historico "n" *--> "1" empenhos : incluídos_reforçados_ou_anulados
  empenhos "1" *--> "n" empenhos_por_fase_operacao : por_fase_de_operação